# # # 知识点扩充
# from jsonpath import jsonpath
#
# data = {"name": "Tom",
#         "msg": {"age": 18,
#                 "name": "汤姆"}
#         }
#
# # 获取字典内第一层指定key对应的value
# res = jsonpath(data, "$.name")
# print(res)
# # 获取字典内每一层指定可以对应的value
# res2 = jsonpath(data, "$..name")
# print(res2)

"""
{'errorCode':'0','username':'liangchao'}

1. 初始化方法:
    1.1 获取预期结果---->dic["expect"]
    1.2 获取接口返回的实际结果 ------> res
    1.3 获取返回结果的状态码

2. 定义一个对外的断言方法:
    2.1 断言状态码是否正确
    2.2 循环断言字典里面的每个键值对:
        2.2.1 根据取出的key获取返回结果响应内的实际结果
        2.2.2 断言取到的实际结果与预期结果是否相同

"""
import jsonpath


# 定义一个类
class PublicAssert:
    # 1. 初始化方法:
    def __init__(self, dic, res):
        # 1.1 获取预期结果---->dic["expect"]
        self.expect = dic["expect"]
        # 1.2 获取接口返回的实际结果 ------> res
        self.res = res

    # 2. 定义一个对外的断言方法:
    def public_assert(self):
        # 2.1 断言状态码是否正确
        assert self.res.status_code in [200, 304], f"请求失败,响应状态码是:{self.res.status_code}"
        # 如果响应体是html格式,进行断言:
        if self.res.text.startswith("<!DOCTYPE html>"):
            # 断言预期结果有没有在html源码内
            assert self.expect in self.res.text, f"断言字段{self.expect}没有在html源码内"
        # 如果响应体是json格式,进行断言:
        else:
            self.expect = eval(self.expect)
            # 预设一个保存错误信息的字符串,初始为空
            msg = ""
            # 2.2 循环断言字典里面的每个键值对:
            for k, v in self.expect.items():
                # 2.2.1 根据取出的key获取返回结果响应内的实际结果
                real = jsonpath.jsonpath(self.res.json(), f"$..{k}")
                # 2.2.2 断言取到的实际结果与预期结果是否相同
                if real == False:
                    # raise AssertionError(f"在响应结果内未找到预期结果字段:{k}")
                    msg += f"\n在响应结果内未找到预期结果字段:{k}"
                else:
                    # assert str(real[0]) == str(v), f"预期结果:{k}:{v}与实际结果:{real}不符"
                    if str(real[0]) != str(v):
                        msg += f"\n预期结果:{k}:{v}与实际结果:{real}不符"
            # 判断msg是否是空串
            assert msg == "", msg


if __name__ == '__main__':
    # 准备测试数据
    from common.readData import ReadData
    from common.confighttp import CinfigHttp

    testdata = ReadData().read_excel()
    print(testdata[0])
    # 接口请求
    res = CinfigHttp(testdata[0]).run()
    print(res.text)
    # 测试当前类
    pa = PublicAssert(testdata[0], res)
    pa.public_assert()
